﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using Newtonsoft.Json;

namespace Ruandao.MiniFace
{
    public class ExternalDetailsWidget : DetailsWidgetBase
    {
        /// <summary>
        /// 微件的属性：
        ///     1. BaseAddress：必须，请求的基准地址，如：http://www.domain.com/。
        ///     2. Url：必须，请求路径,如："widget/articleList"。
        ///     3. DataName: 可选，请求所返回的Json对象放到Python执行环境中所使用的变量名称，默认为DataObject。
        ///     4. 查询字符串参数：由提供请求地址的程序确定，需要查看提供者公开的文档。
        /// 微件的功能：用模板来呈现请求所得到的json对象的详细内容。
        /// </summary>
        public ExternalDetailsWidget()
        {
        }

        protected override List<KeyValuePair<string,dynamic>>  VariablesToPython(TemplateContext templateContext, out dynamic  dataObject)
        {
            var list = new List<KeyValuePair<string, dynamic>>();
            dynamic widgetArgs = new System.Dynamic.ExpandoObject();

            // BaseAddress参数
            string baseAddressArg;
            if (!Properties.TryGetValue("BaseAddress", out baseAddressArg))
            {
                throw new Exception("ExternalDetails微件必须设置BaseAddress属性。");
            }
            widgetArgs.BaseAddress = baseAddressArg;

            // Url参数
            string urlArg;
            if (!Properties.TryGetValue("Url", out urlArg))
            {
                throw new Exception("ExternalDetails微件必须设置Url属性。");
            }
            widgetArgs.Url = urlArg;

            // DataName参数
            string dataNameArg = "DataObject";
            if (Properties.ContainsKey("DataName")) dataNameArg = Properties["DataName"];
            widgetArgs.DataName = dataNameArg;

            // 其他查询参数，请求Url时放到查询字符串中。
            var webClient = new WebClient();
            webClient.BaseAddress = baseAddressArg;
            foreach (var kv in Properties)
            {
                if (kv.Key == "Url" || kv.Key == "BaseAddress") continue;
                widgetArgs.Add(kv.Key, kv.Value);
                webClient.QueryString.Add(kv.Key, kv.Value);
            }
            list.Add(new KeyValuePair<string, dynamic>("WidgetArgs", widgetArgs));


            string json = webClient.DownloadString(urlArg);
            dataObject = JsonConvert.DeserializeObject(json);
            list.Add(new KeyValuePair<string,dynamic>(dataNameArg, dataObject ) );

            return list;
        }
    }
}
